package com.rulesHello;

import com.pojo.Person;
import org.junit.Test;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

/**
 *
 *  对规则语法有了一定的了解后，就可以对规则的执行进行研究了
 *  KieServices ：KieServices是drools的工厂类，用于创建KieContainer对象
 *        通过这个对象可以获取 KieContainer对象
 *        利用 KieContainer对象，创建KieSession对象 和 KieBase 对象
 *        可以获取 KieRepositoryService对象，利用该对象可以管理 KieModel对象
 *        KieServices ：KieServices对象，是一个核心对象。通过它操作各种对象来完成规则构建。管理和执行等。是线程安全的，是单例的
 *
 * KieContainer： 是所有的 KieBase 的容器
 *        可以很方便的操作 KieBase 和 KieSession对象
 *
 * KieBase：是一个知识库(规则库)，包含若干的规则，流程，函数等
 *          在 drools 中，主要的就是规则和方法
 *          KieBase 本身并不包含运行时的相关数据。
 *          如果需要执行 KieBase 中规则，就需要根据 KieBase 创建 KieSession对象
 *          KieBase 是一个接口，可以对规则进行基本操作，如 删除规则、删除查询、删除函数等
 *
 * KieSession：就是 一个与 drools 引擎打交道的会话。基于 KieBase 创建
 *          它会包含运行时的数据，以及 Fact 事实对象。并对运行时数据 Fact 进行规则运算
 *
 * 要想成功使用 drools 需要大量的工作。
 * 规则内容是规则内容，规则文件是规则文件，规则文件只是存放规则内容的一个容器，就算只有规则内容，规则照样是可以执行的。（决策表，规则模板）
 * 规则流中 流程是流程，规则是规则，
 *      规则流属性只能在流程文件规则元素组件对应中使用。
 *      但是流程文件却可以单独运行。
 */
@SuppressWarnings("all")
public class RulesHello {
    @Test
    public void test1() {
        KieServices kss = KieServices.Factory.get();
        KieContainer kc = kss.getKieClasspathContainer();
        KieSession ks = kc.newKieSession("testhelloword");
        int count = ks.fireAllRules();
        System.out.println("执行了" + count + "条规则");
        ks.dispose();
    }

    @Test
    public void test2() {
        KieServices kss = KieServices.Factory.get();
        KieContainer kc = kss.getKieClasspathContainer();
        KieSession ks = kc.newKieSession("testhelloword");
        Person person = new Person();
        ks.insert(person);
        int count = ks.fireAllRules();
        System.out.println("执行了" + count + "条规则");
        ks.dispose();
    }

    @Test
    public void test3() {
        KieServices kss = KieServices.Factory.get();
        KieContainer kc = kss.getKieClasspathContainer();
        KieSession ks = kc.newKieSession("testhelloword");
        Person person = new Person();
        person.setName("张三");
        person.setAge(30);
        ks.insert(person);
        int count = ks.fireAllRules();
        System.out.println("执行了" + count + "条规则");
        ks.dispose();
    }
}
